package service;

import controladoresJpa.AtributoMRJpaController;
import controladoresJpa.exceptions.IllegalOrphanException;
import controladoresJpa.exceptions.NonexistentEntityException;
import controladoresJpa.exceptions.PreexistingEntityException;
import java.io.Serializable;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import model.AtributoMR;

/**
 * Módulo MR
 * Essa classe presta serviços para os atributos que podem ser criado em um Dicionáio de Dados do Modelo Relacional.
 * @author Eduardo, Maylon e Kamilla
 */
public class AtributoMRService implements Serializable{

        private AtributoMRJpaController jpa;
        private static Logger log = Logger.getLogger(AtributoMRService.class.getName());

        /**
         * Método Construtor
         */
        public AtributoMRService() {
            jpa = new AtributoMRJpaController();
        }

        /**
         * Método responsável por salvar e atualizar um Atributo do Modelo Relacional.
         * @param objeto atributo a ser salvo.
         * @throws NonexistentEntityException exceção NonexistentEntityException.
         * @throws Exception exceção.
         */
        public void salvar(AtributoMR objeto){
            if(this.encontrado(objeto))
                try {
            jpa.edit(objeto);
            log.fine("Atributo: "+ objeto.getNome()+" editado ");
        } catch (IllegalOrphanException ex) {
            Logger.getLogger(AtributoMRService.class.getName()).log(Level.SEVERE, null, ex);
        } catch (NonexistentEntityException ex) {
            Logger.getLogger(AtributoMRService.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(AtributoMRService.class.getName()).log(Level.SEVERE, null, ex);
        } 
                //TODO perguntar se ele realmente quer editar    
            else
                try {
            jpa.create(objeto);
            log.fine("Atributo: "+ objeto.getNome()+" salvo com sucesso ");
        } catch (PreexistingEntityException ex) {
            Logger.getLogger(AtributoMRService.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(AtributoMRService.class.getName()).log(Level.SEVERE, null, ex);
        }
        }
    
        /**
         * Método responsável por excluir um Atributo do Modelo Relacional
         * @param objeto atriubuto a ser excluido.
         * @throws NonexistentEntityException exceção NonexistentEntityException.
         */
        public void excluir(AtributoMR objeto) {
            if(this.encontrado(objeto))
                try {
            jpa.destroy(objeto.getNome());
            log.fine("Atributo: "+ objeto.getNome()+" excluido com sucesso");
        } catch (IllegalOrphanException ex) {
            Logger.getLogger(AtributoMRService.class.getName()).log(Level.SEVERE, null, ex);
        } catch (NonexistentEntityException ex) {
            Logger.getLogger(AtributoMRService.class.getName()).log(Level.SEVERE, null, ex);
        } 
        }
        
        /**
         * Método para listar os esquemas já existentes
         * @return 
         */
         public List<AtributoMR> recarregar() {
            return jpa.findAtributoMREntities();
        }
        
       /**
         * Método para procura de um esquema
         * @param objeto
         * @return 
         */
	public boolean encontrado(AtributoMR objeto){
            List lst = jpa.findAtributoMREntities();
            Iterator i = lst.iterator();
            boolean achei = false;
            while(!achei && i.hasNext()){
                AtributoMR a = (AtributoMR) i.next();
                if(objeto.getNome().equals(a.getNome())){
                    log.fine("Atributo: "+ objeto.getNome()+" encontrado ");
                    return true;
                }
            }
                
            log.fine("Atributo: "+ objeto.getNome()+" Não encontrado ");
            return false;
        }
        
      /**
      * Método para recuperaçao de esquemas do BD
      * @param objeto
      * @return 
      */
        public AtributoMR recuperarDoBancoDados(AtributoMR objeto){
            List lst = jpa.findAtributoMREntities();
            Iterator i = lst.iterator();
            boolean achei = false;
            while(!achei && i.hasNext()){
                AtributoMR a = (AtributoMR) i.next();
                if(objeto.getNome().equals(a.getNome())){
                    log.fine("Atributo: "+ objeto.getNome()+" encontrado no banco de dados");
                    return a;
                }
            }
            log.fine("Atributo: "+ objeto.getNome()+" Não encontrado no banco de dados");
            return null;
        }
}
